﻿
//////////////////////////////////////////////////////////////////////////////
//
// Copyright © 1998-2024 Glodon Company Limited.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the “Software”),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//////////////////////////////////////////////////////////////////////////////

#include "GRepUiDocEventHandler.h"
#include "IElement.h"
#include "IDocument.h"
#include "IUiDocument.h"
#include "IUndoRedoEventArgs.h"
#include "IUiDocumentEventArgs.h"
#include "IApplicationEventArgs.h"
#include "IElementsChangeEventArgs.h"

#include "GRepProbe/GrepProbeDlg.h"
#include "EnableCompileWarning_The_LAST_IncludeInCpp.h"


/// 本文件是界面实现的辅助类，不包含GDMP API的演示内容

using namespace gcmp;
using namespace Sample;

bool GRepUiDocEventHandler::m_isClosing = false;

//////////////////////////////////////////////////////////////////////////
void GRepUiDocEventHandler::On(IUiDocumentEventArgs* pArgs)
{
    DBG_WARN_AND_RETURN_VOID_UNLESS(pArgs, L"pArgs为空。",L"GDMP",L"2024-03-30");

    UiDocumentEventType uiEventType = pArgs->GetType();
    if (UiDocumentEventType::UiDocumentClosed == uiEventType ||
        UiDocumentEventType::UiDocumentDeactivated == uiEventType)
    {
        GrepProbeDlg* pDlg = GrepProbeDlg::Get();
        if (pDlg && !IsApplicationClosing())
        {
            pDlg->SetDisplayData(nullptr);
        }
    }
    if (UiDocumentEventType::UiDocumentActivated == uiEventType)
    {
        IUiDocument* pUiDoc = pArgs->GetUiDocument();
        DBG_WARN_AND_RETURN_VOID_UNLESS(pUiDoc, L"pUiDoc为空", L"GDMP", L"2024-03-30");
        IDocument* pDoc = pUiDoc->GetDbDocument();
        DBG_WARN_AND_RETURN_VOID_UNLESS(pDoc, L"pDoc为空", L"GDMP", L"2024-03-30");
        pDoc->AddElementsChangeEventHandler(ElementsChangeEventType::ElementsAdditionEvent, this);
        pDoc->AddElementsChangeEventHandler(ElementsChangeEventType::ElementsPostDeletionEvent, this);
        pDoc->AddElementsChangeEventHandler(ElementsChangeEventType::ElementsPostUpdationEvent, this);
    }
    else if (UiDocumentEventType::UiDocumentDeactivated == uiEventType)
    {
        IUiDocument* pUiDoc = pArgs->GetUiDocument();
        DBG_WARN_AND_RETURN_VOID_UNLESS(pUiDoc, L"pUiDoc为空", L"GDMP", L"2024-03-30");
        IDocument* pDoc = pUiDoc->GetDbDocument();
        DBG_WARN_AND_RETURN_VOID_UNLESS(pDoc, L"pDoc为空", L"GDMP", L"2024-03-30");
        pDoc->DeleteElementsChangeEventHandler(ElementsChangeEventType::ElementsAdditionEvent, this);
        pDoc->DeleteElementsChangeEventHandler(ElementsChangeEventType::ElementsPostDeletionEvent, this);
        pDoc->DeleteElementsChangeEventHandler(ElementsChangeEventType::ElementsPostUpdationEvent, this);
    }
    return;
}

void Sample::GRepUiDocEventHandler::On(IApplicationEventArgs* pArgs)
{
    DBG_WARN_AND_RETURN_VOID_UNLESS(pArgs, L"pArgs为空。", L"GDMP", L"2024-03-30");

    ApplicationEventType appEventType = pArgs->GetType();
    if (ApplicationEventType::PreClose == appEventType)
    {
        m_isClosing = true;
    }
    return;
}

void Sample::GRepUiDocEventHandler::On(IElementsChangeEventArgs* pArgs)
{
    GrepProbeDlg* pDlg = GrepProbeDlg::Get();
    if (pDlg == nullptr)
    {
        return;
    }

    ElementId elemId = pDlg->GetElementId();
    if (!elemId.IsValid())
    {
        return;
    }

    for (auto& iter : pArgs->GetElements())
    {
        if (iter->GetElementId() == elemId)
        {
            pDlg->SetDisplayData(nullptr);
            break;
        }
    }
}

